/**
 *  
 *  Copyright (c) 2011,
 *  GaoTime
 *  All rights reserved.
 *   
 *  @file       BlowFish.h
 *  @brief      数据加密解密工具
 *   
 *  本工具依赖Tools中的Tools_Malloc，Tools_Free两个方法及TBOOL变量
 *   
 *  @version    1.1
 *  @author     imuse
 *  @date       2011-06-16
 *   
 *   
 *  修订说明：最初版本  
 */
#ifndef BLOW_FISH_G
#define BLOW_FISH_G

#include "Tools.h"


#define ROUNDS  (16)
#define BLOCK_SIZE (8)
#define SBOX_SK  (256)
#define P_SZ (ROUNDS + 2)

#define UWORD32 unsigned long
#define UBYTE08 unsigned char

#define MAXKEYBYTES 56          /* 448 bits */
///加密基础已结构
typedef struct BlowFish_tag
{
	UWORD32 S0[SBOX_SK];
	UWORD32 S1[SBOX_SK];
	UWORD32 S2[SBOX_SK];
	UWORD32 S3[SBOX_SK];
	
	UWORD32 P[P_SZ];
	
	TBOOL encrypting;
	
	char workingKey[64];
	int workingKeyLen;
}BlowFish;

/**加密数据
 *
 *  @param BlowFish *sthis      加密基础结构
 *  @param const char *source   源数据
 *  @param int source_len       源数据长度----这个参数无用，可传任何值
 *  @param const int offset     源数据偏移位置
 *  @param const int length     源数据需加密数据长度
 *  @param char *dst            目标数据缓存地址
 *  @param int dst_len          目标数据缓存大小
 *
 *  @return int 加密后的数据长度，<0时加密目标数据dst缓存太小。
 *
 *
 */
int BlowFish_Encrypt(BlowFish *sthis, const char *source, int source_len, const int offset, const int length, char *dst, int dst_len);

/**解密数据
 *
 *  @param BlowFish *sthis      加密基础结构
 *  @param const char *source   源数据
 *  @param int source_len       源数据长度
 *  @param char *dst            目标数据缓存地址
 *  @param int dst_len          目标数据缓存大小
 *
 *  @return int 解密后的数据长度,<0时加密目标数据dst缓存太小。
 *
 *
 */
int BlowFish_Decrypt(BlowFish *sthis, const char *source, int source_len, char *dst, int dst_len);

/**初始化加密解密
 *
 *  @param BlowFish *sthis          加密基础结构
 *  @param const TBOOL encrypting   加密解密状态，加密TRUE,解密FALSE,这里可以传任何值，因在调用,BlowFish_Encrypt或者BlowFish_Decrypt时方法内部会自动处理
 *  @param const char * key         加密解密密钥
  *  @param int key_len             加密解密密钥长度
 *
 *  @return -
 *
 *
 */
void BlowFish_Init(BlowFish *sthis, const TBOOL encrypting, const char * key, int key_len);



#endif
